/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 *
 * @author steve
 */
public class MySQLManager {

    public static Connection staticConnection = null;
    public static boolean habilitarAlertas = true;

    public MySQLManager() {
    }

    public static boolean isHabilitarAlertas() {
        return habilitarAlertas;
    }

    public static void setHabilitarAlertas(boolean habilitarAlertas) {
        MySQLManager.habilitarAlertas = habilitarAlertas;
    }

    /**Este metodo se debe llamar solamente la primera vez que
     * se desee crear la conexion statica, luego se puede usar en cualquier parte
     * con el metodo <code>getConexionEstatica()</code><br><br>
     * La conexion se pega a la base del colegio por defecto
     * @return una conexion a la base de datos
     */
    public static Connection InicializarConexionEstatica() {
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            staticConnection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/clgv", "root", "admin");
        } catch (Exception e) {
            javax.swing.JOptionPane.showMessageDialog(null, "Error al acceder a la base de datos\n\nDetalles:\n" + e.getLocalizedMessage());
            System.out.println("Error en InicializarConexionEstatica: "+e);
        }

        return staticConnection;
    }

    /**Este metodo se debe llamar solamente la primera vez que
     * se desee crear la conexion statica, luego se puede usar en cualquier parte
     * con el metodo <code>getConexionEstatica()</code>
     * @param url una url a la base de dato. ej jdbc:mysql://host:puerto/basededatos
     * @param usuario el usuario de la base de datos
     * @param pass el password
     * @return la conexion estatica
     */
    public static Connection InicializarConexionEstatica(String url, String usuario, String pass) {
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            staticConnection = DriverManager.getConnection(url, usuario, pass);
        } catch (Exception e) {
            javax.swing.JOptionPane.showMessageDialog(null, "Error al acceder a la base de datos\n\nDetalles:\n" + e.getLocalizedMessage());
            System.out.println("Error en InicializarConexionEstatica: "+e);
        }

        return staticConnection;
    }

    /**
     * obtiene una referencia a la conexion estatica
     * @return
     */
    public static Connection getConexionEstatica() {
        return staticConnection;
    }

    /**
     * Ejecuta una consulta del tipo SELECT por lo que es importante solamente enviar como parametro una consulta de este tipo
     * @param sql consulta de tipo SELECT
     * @return un ResultSet con los resultados de la consulta
     */
    public static ResultSet ejecutarConsultaSelect(String sql) {
        ResultSet rs = null;
        try {
            Statement st = staticConnection.createStatement();
            rs = st.executeQuery(sql);
        } catch (SQLException ex) {
            System.out.println("Error en ejecutarConsultaSelect: "+ex);
            if (isHabilitarAlertas()) {
                javax.swing.JOptionPane.showMessageDialog(null, "No se pudo ejecutar la consulta\n\nDetalles:\n" + ex.getLocalizedMessage());
            }
        }
        return rs;
    }

    /**
     * Ejecuta una consulta del tipo SELECT por lo que es importante solamente enviar como parametro una consulta de este tipo
     * !!Ejecuta sentencia next!!
     * @param sql consulta de tipo SELECT
     * @param next establece si se debe ejecutar la sentencia next()
     * @return un ResultSet con los resultados de la consulta
     */
    public static ResultSet ejecutarConsultaSelect(String sql, boolean next) {
        ResultSet rs = null;
        try {
            Statement st = staticConnection.createStatement();
            rs = st.executeQuery(sql);
            if (next) {
                rs.next();
            }
        } catch (SQLException ex) {
            System.out.println("Error en ejecutarConsultaSelect: "+ex);
            if (isHabilitarAlertas()) {
                javax.swing.JOptionPane.showMessageDialog(null, "No se pudo ejecutar la consulta\n\nDetalles:\n" + ex.getLocalizedMessage());
            }
        }
        return rs;
    }

    /**
     * Ejecuta una consulta del tipo INSERT, DELETE o UPDATE por lo que es importante solamente enviar como parametro una consulta de este tipo
     * 
     * @param sql consulta de tipo INSERT, DELETE o UPDATE 
     * @return un ResultSet con los resultados de la consulta
     */
    public static void ejecutarConsultaUpdate(String sql) {

        try {
            Statement st = staticConnection.createStatement();
            st.executeUpdate(sql);
        } catch (SQLException ex) {
            System.out.println("Error en ejecutarConsultaUpdate: "+ex);
            if (isHabilitarAlertas()) {
                javax.swing.JOptionPane.showMessageDialog(null, "No se pudo ejecutar la consulta\n\nDetalles:\n" + ex.getLocalizedMessage());
            }
        }
    }

    /**
     * Este metodo se utiliza para contar los registros de una consulta, dado que JDBC no posee un metodo getRowCount
     * @param sql Consulta del tipo SELECT 
     * @return Numero de filas que compone la consulta, si resultado de consulta esta vacio regresa 0
     */
    public static int contarRegistros(String sql) {
        int ret = 0;
        try {
            ResultSet rs = MySQLManager.ejecutarConsultaSelect(sql);
            rs.last();
            ret = rs.getRow();
        } catch (SQLException ex) {
            System.out.println("Error en contarRegistros... " + ex);
        }
        return ret;
    }
}




